# 1. bash 脚本笔记
# 1.1. 模式扩展
# 1.1.1. ? 字符扩展
?字符代表文件路径里面的任意单个字符,不包括空字符。比如,Data???匹配所有Data后面跟着三个字符的文件名。
? 字符扩展属于文件名扩展,只有文件确实存在的前提下,才会发生扩展。如果文件不存在,扩展就不会发生。
# 1.1.2.
# 1.1.3. *字符
*字符代表文件路径里面的任意数量的任意字符,包括零个字符。
注意,**不会匹配隐藏文件(以.开头的文件),即ls 不会输出隐藏文件。
如果要匹配隐藏文件,需要写成.*。
比如echo .*
*只匹配当前目录,不会匹配子目录。
# 1.1.4. 子命令扩展
$(...)可以扩展成另一个命令的运行结果,该命令的所有输出都会作为返回值。
$ echo $(date)
Tue Jan 28 00:01:13 CST 2020
还有另一种较老的语法,子命令放在反引号之中,也可以扩展成命令的运行结果。
$ echo `date`
Tue Jan 28 00:01:13 CST 2020
$(...)可以嵌套,比如$(ls $(pwd))。
# 1.1.5. 算术扩展
$((...))可以扩展成整数运算的结果。
$ echo $((2 + 2))
4
# 1.2. 变量
读取变量的时候,变量名也可以使用花括号{}包围,比如$a
也可以写成${a}
。这种写法可以用于变量名与其他字符连用的情况。
$ a=foo
$ echo $a_file
$ echo ${a}_file
foo_file
上面代码中,变量名a_file不会有任何输出,因为 Bash 将其整个解释为变量,而这个变量是不存在的。只有用花括号区分$a,Bash 才能正确解读。
事实上,读取变量的语法$foo
,可以看作是${foo}
的简写形式。
小结:${}
是读取变量,$()
是子命令扩展,$(())
是算术扩展。